/*
 * Principal.java
 *
 * Created on 5 de mayo de 2007, 09:27 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package adsi.branchbound3;
import java.util.*;
/**
 *
 * @author Aramis
 */
public class Principal {
    
    Arbol arbol = new Arbol();
    Vector Tareas = new Vector();
    Vector schedule;
    Vector TareasEDD=new Vector();
    int NIVEL=0;
    int Lmax;
    long ID;
    /**
     * Creates a new instance of Principal
     */
    public Principal(long id)
    {
        ID=id;
        agregaNivelCero();
    }
    public long getID()
    {
        return ID;
    }
    public void insertaTarea(Tarea T)
    {
        Tareas.add(T);
        obtenEDD();
        NIVEL=0;
        while(NIVEL<Tareas.size()) //Tareas.size();
        {
            agregaNivel();
            disponibilidad();
            NIVEL++; 
        }
    }
    
    public void eliminaTarea(Tarea t)
    {
        if(Tareas.contains(t))
        {
            Tareas.remove(t);
            agregaNivelCero();
        }
    }
    public Vector getTareas()
    {
        return Tareas;
    }
    
    public void agregaNivelCero()
    {
        Tarea t = new Tarea(0,0,0,0);
        Nodo n = new Nodo(t);
        Arbol ar = new Arbol(n);
        arbol = ar;
    }
    
    public void agregaNivel()
    {
        int i,j,nivel;
        Vector padres = arbol.arregloInsercion();
        Vector sec;
        int tiempo;
        boolean primero=true;
        Nodo Padre;
        for(i=0;i<padres.size();i++)
        {
            //primero=true;
            Padre = (Nodo) padres.get(i);
            //((Nodo) padres.get(i))
            //si el padre est� disponible...
            
            if(Padre.disponible==true)
            {
                //pido la secuencia del padre
                sec=Padre.secuencia();
                //pido el tiempo del padre
                tiempo=Padre.calculaCNodo(sec);
                //intento cada tarea que NO est� en la secuencia
                for(j=0;j<Tareas.size();j++)
                {
                    Tarea tar = (Tarea) Tareas.get(j);
                    
                    if(sec.contains(tar)==false)    //No est� en la secuencia
                    {
                        //inserto las que no est�n en la secuencia
                        nivel = Padre.nivel + 1;
                        Nodo n = new Nodo(tar,nivel,Padre);
                        Padre.apuntadores.add(n);
                        //si es la primera, lo ligo al siguiente centinela.
                        if(primero==true)
                        {
                            arbol.aumentaProfundidad(n);
                            primero=false;
                        }
                    }
                }
            }
        }
    }
    public void disponibilidad()
    {
    //{REGLA DEL LIBRO}
        int i,j,k,tiempo,max=0,min=1000,cota=10000;
        Nodo N;
        Vector sec,s;
        Vector EDD=new Vector();
        Vector NodosEDD=new Vector();
        Vector insertados = arbol.arregloInsercion();
        
        //REGLA 1: rj<min(max(t,rl)+pl)):
        
        for(i=0;i<insertados.size();i++)
        {
            N = (Nodo) insertados.get(i);
            sec = N.secuencia();
            N.calculaCNodo(sec);
            tiempo=N.padre.Cnodo;
            for(j=0;j<Tareas.size();j++)
            {
                Tarea tar = (Tarea) Tareas.get(j);
                if(sec.contains(tar)==false)
                {
                    if(tiempo<tar.rj)
                        max=tar.rj;
                    else
                       max=tiempo;
                    
                    if(max+tar.pj<min)
                        min=max+tar.pj;
                }
            }
            if(N.tarea.rj>=min)
                ((Nodo)((Centinela) arbol.centinelas.get(arbol.profundidad)).nodo.padre.apuntadores.get(i)).disponible=false;  
        }

    }
    
    public void obtenEDD()
    {
        int i,j=0,min;
        TareasEDD=Tareas;
        Tarea t;
        i=0;
        min=((Tarea) TareasEDD.get(0)).dj;
        for(i=0;i<TareasEDD.size();i++)
        {
            for(j=0;j<TareasEDD.size();j++)
            {
                if(((Tarea) TareasEDD.get(i)).dj < ((Tarea) TareasEDD.get(j)).dj)
                {
                    t = ((Tarea) TareasEDD.get(j));
                    TareasEDD.set(j,((Tarea) TareasEDD.get(i)));
                    TareasEDD.set(i,t);
                }
            }
        }
    }
    
    public int obtenLmax()
    {
        int i,max;
        Vector hojas = arbol.arregloInsercion();
        Vector sec;
        Nodo N;
        N = (Nodo) hojas.get(0);
        schedule=N.secuencia();
        N.calculaCNodo(schedule);
        max=N.calculaLmax();
        for(i=1;i<hojas.size();i++)
        {
            N = (Nodo) hojas.get(i);
            sec = N.secuencia();
            N.calculaCNodo(sec);
            if(N.calculaLmax() > max)
            {
                max=N.calculaLmax();
                schedule=sec;
            }
        }
        Lmax=max;
        return Lmax;
        
    }
       public void imprimeTareas()
    {
        int i;
        for(i=0;i<Tareas.size();i++)
            /*((Tarea) schedule.get(i)).imprime(); */ ((Tarea) Tareas.get(i)).imprime();
        //System.out.println("Lmax es: " + Lmax);
      }
}
